vditor 3.11.1 → 3.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -201,7 +201,7 @@ Markdown 输出的 HTML 所展现的外观。内置 ant-design, light,dark,w
201
201
  | minHeight | 编辑区域最小高度 | - |
202
202
  | width | 编辑器总宽度,支持 % | 'auto' |
203
203
  | placeholder | 输入区域为空时的提示 | '' |
204
- | lang | 语言种类:de_DE, en_US, fr_FR, pt_BR, ja_JP, ko_KR, ru_RU, sv_SE, zh_CN, zh_TW | 'zh_CN' |
204
+ | lang | 语言种类:de_DE, en_US, es_ES, fr_FR, ja_JP, ko_KR, pt_BR, ru_RU, sv_SE, vi_VN, zh_CN, zh_TW | 'zh_CN' |
205
205
  | input(value: string) | 输入后触发 | - |
206
206
  | focus(value: string) | 聚焦后触发 | - |
207
207
  | blur(value: string) | 失焦后触发 | - |
@@ -219,6 +219,7 @@ Markdown 输出的 HTML 所展现的外观。内置 ant-design, light,dark,w
219
219
  | theme | 主题:classic, dark | 'classic' |
220
220
  | icon | 图标风格:ant, material | 'ant' |
221
221
  | customRenders: {language: string, render: (element: HTMLElement, vditor: IVditor) => void}[] | 自定义渲染器 | [] |
222
+ | customWysiwygToolbar(type: TWYSISYGToolbar, element: HTMLElement): void | 对 wysiwyg 模式下的工具栏进行自定义 | - |
222
223
 
223
224
  #### options.toolbar
224
225
 
package/dist/index.css CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vditor v3.11.1 - A markdown editor written in TypeScript.
2
+ * Vditor v3.11.2 - A markdown editor written in TypeScript.
3
3
  *
4
4
  * MIT License
5
5
  *
@@ -25,7 +25,7 @@
25
25
  *
26
26
  */
27
27
  /*!
28
- * Vditor v3.11.1 - A markdown editor written in TypeScript.
28
+ * Vditor v3.11.2 - A markdown editor written in TypeScript.
29
29
  *
30
30
  * MIT License
31
31
  *
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vditor v3.11.1 - A markdown editor written in TypeScript.
2
+ * Vditor v3.11.2 - A markdown editor written in TypeScript.
3
3
  *
4
4
  * MIT License
5
5
  *
@@ -2471,7 +2471,7 @@ var previewRender = function (previewElement, markdown, options) { return __awai
2471
2471
  previewElement.innerHTML = html;
2472
2472
  previewElement.classList.add("vditor-reset");
2473
2473
  if (!!mergedOptions.i18n) return [3 /*break*/, 5];
2474
- if (!!["de_DE", "en_US", "fr_FR", "pt_BR", "ja_JP", "ko_KR", "ru_RU", "sv_SE", "zh_CN", "zh_TW"].includes(mergedOptions.lang)) return [3 /*break*/, 2];
2474
+ if (!!["de_DE", "en_US", "es_ES", "fr_FR", "ja_JP", "ko_KR", "pt_BR", "ru_RU", "sv_SE", "vi_VN", "zh_CN", "zh_TW"].includes(mergedOptions.lang)) return [3 /*break*/, 2];
2475
2475
  throw new Error("options.lang error, see https://ld246.com/article/1549638745630#options");
2476
2476
  case 2:
2477
2477
  i18nScriptPrefix = "vditorI18nScript";
@@ -2633,7 +2633,7 @@ var Vditor = /** @class */ (function () {
2633
2633
  /* harmony export */ "H": () => (/* binding */ _VDITOR_VERSION),
2634
2634
  /* harmony export */ "g": () => (/* binding */ Constants)
2635
2635
  /* harmony export */ });
2636
- var _VDITOR_VERSION = "3.11.1";
2636
+ var _VDITOR_VERSION = "3.11.2";
2637
2637
 
2638
2638
  var Constants = /** @class */ (function () {
2639
2639
  function Constants() {
@@ -2681,7 +2681,7 @@ var Constants = /** @class */ (function () {
2681
2681
  // 别名
2682
2682
  "js", "ts", "html", "toml", "c#", "bat"
2683
2683
  ];
2684
- Constants.CDN = "https://unpkg.com/vditor@".concat("3.11.1");
2684
+ Constants.CDN = "https://unpkg.com/vditor@".concat("3.11.2");
2685
2685
  Constants.MARKDOWN_OPTIONS = {
2686
2686
  autoSpace: false,
2687
2687
  gfmAutoLink: true,
@@ -4785,7 +4785,13 @@ var insertHTML = function (html, vditor) {
4785
4785
  vditor[vditor.currentMode].element.insertAdjacentHTML("beforeend", pasteElement.innerHTML);
4786
4786
  }
4787
4787
  else {
4788
- blockElement.insertAdjacentHTML("afterend", pasteElement.innerHTML);
4788
+ var liElement = (0,_hasClosest__WEBPACK_IMPORTED_MODULE_1__/* .hasClosestByMatchTag */ .lG)(range.startContainer, "LI");
4789
+ if (liElement && pasteElement.firstElementChild.tagName === "UL") {
4790
+ liElement.insertAdjacentHTML("afterend", pasteElement.firstElementChild.innerHTML);
4791
+ }
4792
+ else {
4793
+ blockElement.insertAdjacentHTML("afterend", pasteElement.innerHTML);
4794
+ }
4789
4795
  }
4790
4796
  setRangeByWbr(vditor[vditor.currentMode].element, range);
4791
4797
  }
@@ -7132,6 +7138,7 @@ var highlightToolbarWYSIWYG = function (vditor) {
7132
7138
  if (footnotesElement) {
7133
7139
  vditor.wysiwyg.popover.innerHTML = "";
7134
7140
  genClose(footnotesElement, vditor);
7141
+ customWysiwygToolbar(vditor, "footnotes-block");
7135
7142
  setPopoverPosition(vditor, footnotesElement);
7136
7143
  return;
7137
7144
  }
@@ -7254,6 +7261,7 @@ var highlightToolbarWYSIWYG = function (vditor) {
7254
7261
  if (tocElement) {
7255
7262
  vditor.wysiwyg.popover.innerHTML = "";
7256
7263
  genClose(tocElement, vditor);
7264
+ customWysiwygToolbar(vditor, "vditor-toc");
7257
7265
  setPopoverPosition(vditor, tocElement);
7258
7266
  return;
7259
7267
  }
@@ -7264,6 +7272,7 @@ var highlightToolbarWYSIWYG = function (vditor) {
7264
7272
  genUp(range, blockquoteElement, vditor);
7265
7273
  genDown(range, blockquoteElement, vditor);
7266
7274
  genClose(blockquoteElement, vditor);
7275
+ customWysiwygToolbar(vditor, "blockquote");
7267
7276
  setPopoverPosition(vditor, blockquoteElement);
7268
7277
  }
7269
7278
  // list item popover
@@ -7272,6 +7281,7 @@ var highlightToolbarWYSIWYG = function (vditor) {
7272
7281
  genUp(range, liElement, vditor);
7273
7282
  genDown(range, liElement, vditor);
7274
7283
  genClose(liElement, vditor);
7284
+ customWysiwygToolbar(vditor, "li");
7275
7285
  setPopoverPosition(vditor, liElement);
7276
7286
  }
7277
7287
  // table popover
@@ -7586,6 +7596,7 @@ var highlightToolbarWYSIWYG = function (vditor) {
7586
7596
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", inputWrap);
7587
7597
  vditor.wysiwyg.popover.insertAdjacentHTML("beforeend", " x ");
7588
7598
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", input2Wrap);
7599
+ customWysiwygToolbar(vditor, "table");
7589
7600
  setPopoverPosition(vditor, tableElement);
7590
7601
  }
7591
7602
  // link ref popover
@@ -7629,6 +7640,7 @@ var highlightToolbarWYSIWYG = function (vditor) {
7629
7640
  };
7630
7641
  genClose(footnotesRefElement, vditor);
7631
7642
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", inputWrap);
7643
+ customWysiwygToolbar(vditor, "footnotes-ref");
7632
7644
  setPopoverPosition(vditor, footnotesRefElement);
7633
7645
  }
7634
7646
  // block popover: math-inline, math-block, html-block, html-inline, code-block, html-entity
@@ -7721,6 +7733,10 @@ var highlightToolbarWYSIWYG = function (vditor) {
7721
7733
  event.preventDefault();
7722
7734
  };
7723
7735
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", languageWrap);
7736
+ customWysiwygToolbar(vditor, "code-block");
7737
+ }
7738
+ else {
7739
+ customWysiwygToolbar(vditor, "block");
7724
7740
  }
7725
7741
  setPopoverPosition(vditor, blockRenderElement);
7726
7742
  }
@@ -7759,6 +7775,7 @@ var highlightToolbarWYSIWYG = function (vditor) {
7759
7775
  genDown(range, headingElement, vditor);
7760
7776
  genClose(headingElement, vditor);
7761
7777
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", inputWrap);
7778
+ customWysiwygToolbar(vditor, "heading");
7762
7779
  setPopoverPosition(vditor, headingElement);
7763
7780
  }
7764
7781
  // a popover
@@ -7781,6 +7798,7 @@ var highlightToolbarWYSIWYG = function (vditor) {
7781
7798
  genUp(range, blockElement, vditor);
7782
7799
  genDown(range, blockElement, vditor);
7783
7800
  genClose(blockElement, vditor);
7801
+ customWysiwygToolbar(vditor, "block");
7784
7802
  setPopoverPosition(vditor, blockElement);
7785
7803
  }
7786
7804
  else {
@@ -7878,6 +7896,7 @@ var genLinkRefPopover = function (vditor, linkRefElement, range) {
7878
7896
  genClose(linkRefElement, vditor);
7879
7897
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", inputWrap);
7880
7898
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", input1Wrap);
7899
+ customWysiwygToolbar(vditor, "link-ref");
7881
7900
  setPopoverPosition(vditor, linkRefElement);
7882
7901
  };
7883
7902
  var genUp = function (range, element, vditor) {
@@ -8051,6 +8070,7 @@ var genAPopover = function (vditor, aElement, range) {
8051
8070
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", inputWrap);
8052
8071
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", input1Wrap);
8053
8072
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", input2Wrap);
8073
+ customWysiwygToolbar(vditor, "a");
8054
8074
  setPopoverPosition(vditor, aElement);
8055
8075
  };
8056
8076
  var genImagePopover = function (event, vditor) {
@@ -8111,6 +8131,7 @@ var genImagePopover = function (event, vditor) {
8111
8131
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", inputWrap);
8112
8132
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", altWrap);
8113
8133
  vditor.wysiwyg.popover.insertAdjacentElement("beforeend", titleWrap);
8134
+ customWysiwygToolbar(vditor, "image");
8114
8135
  setPopoverPosition(vditor, imgElement);
8115
8136
  };
8116
8137
  var focusToElement = function (event, range) {
@@ -8123,6 +8144,9 @@ var focusToElement = function (event, range) {
8123
8144
  return true;
8124
8145
  }
8125
8146
  };
8147
+ var customWysiwygToolbar = function (vditor, type) {
8148
+ vditor.options.customWysiwygToolbar(type, vditor.wysiwyg.popover);
8149
+ };
8126
8150
 
8127
8151
  ;// CONCATENATED MODULE: ./src/ts/util/highlightToolbar.ts
8128
8152
 
@@ -9817,7 +9841,7 @@ var fixCJKPosition = function (range, vditor, event) {
9817
9841
  if (pLiElement && (0,selection/* getSelectPosition */.im)(pLiElement, vditor[vditor.currentMode].element, range).start === 0) {
9818
9842
  // https://github.com/Vanessa219/vditor/issues/1289 WKWebView切换输入法产生六分之一空格,造成光标错位
9819
9843
  if (pLiElement.nodeValue) {
9820
- pLiElement.nodeValue = pLiElement.nodeValue.replace(/\u2006/g, '');
9844
+ pLiElement.nodeValue = pLiElement.nodeValue.replace(/\u2006/g, "");
9821
9845
  }
9822
9846
  var zwspNode = document.createTextNode(constants/* Constants.ZWSP */.g.ZWSP);
9823
9847
  range.insertNode(zwspNode);
@@ -11111,15 +11135,23 @@ var paste = function (vditor, event, callback) { return fixBrowserBehavior_await
11111
11135
  processCodeRender(codeElement.parentElement.nextElementSibling, vditor);
11112
11136
  }
11113
11137
  }
11114
- return [3 /*break*/, 8];
11138
+ return [3 /*break*/, 10];
11115
11139
  case 1:
11116
11140
  if (!code) return [3 /*break*/, 2];
11117
11141
  callback.pasteCode(code);
11118
- return [3 /*break*/, 8];
11142
+ return [3 /*break*/, 10];
11119
11143
  case 2:
11120
- if (!(textHTML.trim() !== "")) return [3 /*break*/, 3];
11144
+ if (!(textHTML.trim() !== "")) return [3 /*break*/, 5];
11121
11145
  tempElement = document.createElement("div");
11122
11146
  tempElement.innerHTML = textHTML;
11147
+ if (!!vditor.options.upload.base64ToLink) return [3 /*break*/, 4];
11148
+ // word 复制的图文混合,替换为 link: <v:imagedata src="file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png" o:title="">
11149
+ return [4 /*yield*/, processVMLImage(vditor, tempElement, ("clipboardData" in event ? event.clipboardData : event.dataTransfer).getData("text/rtf"))];
11150
+ case 3:
11151
+ // word 复制的图文混合,替换为 link: <v:imagedata src="file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png" o:title="">
11152
+ _b.sent();
11153
+ _b.label = 4;
11154
+ case 4:
11123
11155
  tempElement.querySelectorAll("[style]").forEach(function (e) {
11124
11156
  e.removeAttribute("style");
11125
11157
  });
@@ -11142,15 +11174,15 @@ var paste = function (vditor, event, callback) { return fixBrowserBehavior_await
11142
11174
  processPaste(vditor, vditor.lute.HTML2Md(tempElement.innerHTML).trimRight());
11143
11175
  }
11144
11176
  vditor.outline.render(vditor);
11145
- return [3 /*break*/, 8];
11146
- case 3:
11147
- if (!(files.length > 0)) return [3 /*break*/, 7];
11148
- if (!(vditor.options.upload.url || vditor.options.upload.handler)) return [3 /*break*/, 5];
11177
+ return [3 /*break*/, 10];
11178
+ case 5:
11179
+ if (!(files.length > 0)) return [3 /*break*/, 9];
11180
+ if (!(vditor.options.upload.url || vditor.options.upload.handler)) return [3 /*break*/, 7];
11149
11181
  return [4 /*yield*/, uploadFiles(vditor, files)];
11150
- case 4:
11182
+ case 6:
11151
11183
  _b.sent();
11152
- return [3 /*break*/, 6];
11153
- case 5:
11184
+ return [3 /*break*/, 8];
11185
+ case 7:
11154
11186
  fileReader_1 = new FileReader();
11155
11187
  if ("clipboardData" in event) {
11156
11188
  files = event.clipboardData.files;
@@ -11163,7 +11195,7 @@ var paste = function (vditor, event, callback) { return fixBrowserBehavior_await
11163
11195
  if (file_1 && file_1.type.startsWith("image")) {
11164
11196
  fileReader_1.readAsDataURL(file_1);
11165
11197
  fileReader_1.onload = function () {
11166
- var imgHTML = '';
11198
+ var imgHTML = "";
11167
11199
  if (vditor.currentMode === "wysiwyg") {
11168
11200
  imgHTML += "<img alt=\"".concat(file_1.name, "\" src=\"").concat(fileReader_1.result.toString(), "\">\n");
11169
11201
  }
@@ -11173,9 +11205,9 @@ var paste = function (vditor, event, callback) { return fixBrowserBehavior_await
11173
11205
  document.execCommand("insertHTML", false, imgHTML);
11174
11206
  };
11175
11207
  }
11176
- _b.label = 6;
11177
- case 6: return [3 /*break*/, 8];
11178
- case 7:
11208
+ _b.label = 8;
11209
+ case 8: return [3 /*break*/, 10];
11210
+ case 9:
11179
11211
  if (textPlain.trim() !== "" && files.length === 0) {
11180
11212
  range = (0,selection/* getEditorRange */.zh)(vditor);
11181
11213
  if (range.toString() !== "" && vditor.lute.IsValidLinkDest(textPlain)) {
@@ -11184,12 +11216,12 @@ var paste = function (vditor, event, callback) { return fixBrowserBehavior_await
11184
11216
  if (vditor.currentMode === "ir") {
11185
11217
  renderers.Md2VditorIRDOM = { renderLinkDest: renderLinkDest };
11186
11218
  vditor.lute.SetJSRenderers({ renderers: renderers });
11187
- (0,selection/* insertHTML */.oC)(vditor.lute.Md2VditorIRDOM(textPlain), vditor);
11219
+ (0,selection/* insertHTML */.oC)(Lute.Sanitize(vditor.lute.Md2VditorIRDOM(textPlain)), vditor);
11188
11220
  }
11189
11221
  else if (vditor.currentMode === "wysiwyg") {
11190
11222
  renderers.Md2VditorDOM = { renderLinkDest: renderLinkDest };
11191
11223
  vditor.lute.SetJSRenderers({ renderers: renderers });
11192
- (0,selection/* insertHTML */.oC)(vditor.lute.Md2VditorDOM(textPlain), vditor);
11224
+ (0,selection/* insertHTML */.oC)(Lute.Sanitize(vditor.lute.Md2VditorDOM(textPlain)), vditor);
11193
11225
  }
11194
11226
  else {
11195
11227
  renderers.Md2VditorSVDOM = { renderLinkDest: renderLinkDest };
@@ -11198,8 +11230,8 @@ var paste = function (vditor, event, callback) { return fixBrowserBehavior_await
11198
11230
  }
11199
11231
  vditor.outline.render(vditor);
11200
11232
  }
11201
- _b.label = 8;
11202
- case 8:
11233
+ _b.label = 10;
11234
+ case 10:
11203
11235
  if (vditor.currentMode !== "sv") {
11204
11236
  blockElement = (0,hasClosest/* hasClosestBlock */.F9)((0,selection/* getEditorRange */.zh)(vditor).startContainer);
11205
11237
  if (blockElement) {
@@ -11231,6 +11263,81 @@ var paste = function (vditor, event, callback) { return fixBrowserBehavior_await
11231
11263
  }
11232
11264
  });
11233
11265
  }); };
11266
+ var processVMLImage = function (vditor, root, rtfData) { return fixBrowserBehavior_awaiter(void 0, void 0, void 0, function () {
11267
+ var regexPictureHeader, regexPicture, regImages, images, _i, regImages_1, image, imageType, shapes, i, img, newSrc, imgs, i, src, _a;
11268
+ return fixBrowserBehavior_generator(this, function (_b) {
11269
+ switch (_b.label) {
11270
+ case 0:
11271
+ if (!rtfData) {
11272
+ return [2 /*return*/];
11273
+ }
11274
+ regexPictureHeader = /{\\pict[\s\S]+?\\bliptag-?\d+(\\blipupi-?\d+)?({\\\*\\blipuid\s?[\da-fA-F]+)?[\s}]*?/;
11275
+ regexPicture = new RegExp("(?:(" + regexPictureHeader.source + "))([\\da-fA-F\\s]+)\\}", "g");
11276
+ regImages = rtfData.match(regexPicture);
11277
+ images = [];
11278
+ if (regImages) {
11279
+ for (_i = 0, regImages_1 = regImages; _i < regImages_1.length; _i++) {
11280
+ image = regImages_1[_i];
11281
+ imageType = void 0;
11282
+ if (image.includes("\\pngblip")) {
11283
+ imageType = "image/png";
11284
+ }
11285
+ else if (image.includes("\\jpegblip")) {
11286
+ imageType = "image/jpeg";
11287
+ }
11288
+ if (imageType) {
11289
+ images.push({
11290
+ hex: image.replace(regexPictureHeader, "").replace(/[^\da-fA-F]/g, ""),
11291
+ type: imageType,
11292
+ });
11293
+ }
11294
+ }
11295
+ }
11296
+ shapes = [];
11297
+ walk(root, function (child) {
11298
+ if (child.tagName === "V:SHAPE") {
11299
+ walk(child, function (sub) {
11300
+ if (sub.tagName === "V:IMAGEDATA")
11301
+ shapes.push({ shape: child, img: sub });
11302
+ });
11303
+ return false;
11304
+ }
11305
+ });
11306
+ for (i = 0; i < shapes.length; i++) {
11307
+ img = document.createElement("img");
11308
+ newSrc = "data:" + images[i].type + ";base64," + btoa((images[i].hex.match(/\w{2}/g) || []).map(function (char) {
11309
+ return String.fromCharCode(parseInt(char, 16));
11310
+ }).join(""));
11311
+ img.src = newSrc;
11312
+ img.title = shapes[i].img.getAttribute("title");
11313
+ shapes[i].shape.parentNode.replaceChild(img, shapes[i].shape);
11314
+ }
11315
+ imgs = root.querySelectorAll("img");
11316
+ i = 0;
11317
+ _b.label = 1;
11318
+ case 1:
11319
+ if (!(i < imgs.length)) return [3 /*break*/, 4];
11320
+ src = imgs[i].src || "";
11321
+ if (!src) return [3 /*break*/, 3];
11322
+ _a = imgs[i];
11323
+ return [4 /*yield*/, vditor.options.upload.base64ToLink(src)];
11324
+ case 2:
11325
+ _a.src = _b.sent();
11326
+ _b.label = 3;
11327
+ case 3:
11328
+ i++;
11329
+ return [3 /*break*/, 1];
11330
+ case 4: return [2 /*return*/];
11331
+ }
11332
+ });
11333
+ }); };
11334
+ var walk = function (el, fn) {
11335
+ var goNext = fn(el);
11336
+ if (goNext !== false)
11337
+ for (var i = 0; i < el.children.length; i++) {
11338
+ walk(el.children[i], fn);
11339
+ }
11340
+ };
11234
11341
  var templateObject_1;
11235
11342
 
11236
11343
  ;// CONCATENATED MODULE: ./src/ts/ir/process.ts
@@ -15437,7 +15544,7 @@ var Vditor = /** @class */ (function (_super) {
15437
15544
  var mergedOptions = getOptions.merge();
15438
15545
  // 支持自定义国际化
15439
15546
  if (!mergedOptions.i18n) {
15440
- if (!["de_DE", "en_US", "fr_FR", "pt_BR", "ja_JP", "ko_KR", "ru_RU", "sv_SE", "zh_CN", "zh_TW"].includes(mergedOptions.lang)) {
15547
+ if (!["de_DE", "en_US", "es_ES", "fr_FR", "ja_JP", "ko_KR", "pt_BR", "ru_RU", "sv_SE", "vi_VN", "zh_CN", "zh_TW"].includes(mergedOptions.lang)) {
15441
15548
  throw new Error("options.lang error, see https://ld246.com/article/1549638745630#options");
15442
15549
  }
15443
15550
  else {